package com.java.basis.thread.n8.pool;

import jdk.nashorn.internal.ir.ReturnNode;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Starvation：饥饿
 * 测试线程饥饿问题：针对饥饿问题怎么解决呢？
 * 	我们可以进行合理的分工，针对不同的任务创建不同的线程池
 * 	解决方法详见 TestStarvation02
 * @author wangning
 * @create 2022-02-10 15:52
 */
@Slf4j(topic = "c.TestStarvation")
public class TestStarvation {
	static final List<String> MENU = Arrays.asList("地三鲜", "宫保鸡丁", "辣子鸡丁", "烤鸡翅");
	static Random random = new Random();
	static String cooking() {
		return MENU.get(random.nextInt(MENU.size()));
	}

	public static void main(String[] args) {
		ExecutorService executorService = Executors.newFixedThreadPool(2);
		executorService.execute(() -> {
			//使用线程池创建两个线程，其中一个已经处理点餐了，然后告诉另一个开始做菜，等待菜做好
			log.debug("处理点餐...");
			//调用另一个线程进行做菜
			Future<String> f = executorService.submit(() -> {
				log.debug("做菜");
				return cooking();
			});
			try {
				log.debug("上菜 {}", f.get());
			} catch (ExecutionException | InterruptedException e) {
				e.printStackTrace();
			}

		});

//		executorService.execute(() -> {
//			log.debug("处理点餐...");
//			Future<String> f = executorService.submit(() -> {
//				log.debug("做菜");
//				return cooking();
//			});
//			try {
//				log.debug("上菜 {}", f.get());
//			} catch (ExecutionException | InterruptedException e) {
//				e.printStackTrace();
//			}
//
//		});

	}

}
